package com;

import com.controller.EmpController;
import com.dao.DbConfig;
import com.dao.EmpDao;
import com.dao.impl.EmpDaoImpl;
import com.service.EmpService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 有4个注解可以修饰在类上，表明会被spring扫描管理
 * 1.@Component：所有其它组件就放这个注解
 * 2.@Repository：放在dao或者mapper这种持久层的实现类
 * 3.@Service：放在业务类
 * 4.@Controller :建议放在控制器上
 * <p>
 * 1. 想被spring管理的类上面写上上面4个注解中的任意一个都可以
 * 2.上面的只是建议
 * 3.不排除spring框架以后给这些注解赋予特别的含义，比如给Repository额外的功能
 * 如果出现这种情况，就应该严格安装建议来放置注解
 * 4. 其实Controller，Service，Repository注解上面都有Component这个元注解
 */

public class Main {
    public static void main(String[] args) {
        //参数可以有多个值，设定之后每个参数包下面的类都会去扫描
        //只要找到有@Component注解修饰的类就会被管理起来

        //基础包名：从后往前一点点去掉才叫基础包


        //helloWorld();
        //fourAnnotation();
        //scopeDemo();
        ApplicationContext context = new AnnotationConfigApplicationContext("com");
        EmpService service = context.getBean(EmpService.class);
        //注意：原型作用域是不被spring管理生命周期的，所以close的时候destroy方法不会执行，
        ((ConfigurableApplicationContext) context).close();
    }

    private static void scopeDemo() {
        ApplicationContext context = new AnnotationConfigApplicationContext("com");
        EmpService service = context.getBean(EmpService.class);
        EmpService service2 = context.getBean(EmpService.class);
    }

    private static void fourAnnotation() {
        ApplicationContext context = new AnnotationConfigApplicationContext("com");
        DbConfig dbConfig = context.getBean(DbConfig.class);
        EmpDao dao = context.getBean(EmpDao.class);
        EmpService service = context.getBean(EmpService.class);
        EmpController controller = context.getBean(EmpController.class);

        System.out.println(dbConfig);
        System.out.println(dao);
        System.out.println(service);
        System.out.println(controller);
    }

    private static void helloWorld() {
        ApplicationContext context = new AnnotationConfigApplicationContext("com.dao");
        EmpDaoImpl empDao = context.getBean("empDaoImpl", EmpDaoImpl.class);
        empDao.insert();
    }
}
